package com.heima.leetcode.practice;

/**
 * @description: leetcode 260. 找出只出现一次的数字 II
 * @author 勾新杰
 * @version 1.0
 * @date 2025/1/16 8:54
 */
public class E260 {

    /**
     * <h3>方法一：分组</h3>
     * @param nums nums数组
     * @return 两个只出现一次的数字
     */
    public int[] singleNumber(int[] nums) {
        int[] result = new int[2];
        // 1. 获取两个只出现一次的数字的异或结果
        int xor = 0;
        for (int num : nums) xor ^= num;
        // 2. 获取两个只出现一次的数字的二进制表示中，低位到高位第一个为1的位
        int mask = xor & (-xor);
        // 3. 根据mask将nums数组分为两组，分别计算两组中只出现一次的数字的异或结果
        // 这里通过mask的位将该位0的分一组，1的分一组，而出现一次的分开了，其他的都是出现两次的，各组中各占一部分
        for (int num : nums) {
            if ((num & mask) == 0) result[0] ^= num;
            else result[1] ^= num;
        }
        // 4. 返回结果
        return result;
    }
}
